From 99ec335f1f137196670a10027200bf0f221ffa5f Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 2 Feb 2016 09:36:29 -0800 Subject: [PATCH] Add convenience helpers to map source ids Should help easily mapping packages from one source to another --- src/cargo/core/dependency.rs | 12 ++++++++++++ src/cargo/core/manifest.rs | 11 ++++++++++- src/cargo/core/package.rs | 8 ++++++++ src/cargo/core/package_id.rs | 10 ++++++++++ src/cargo/core/summary.rs | 13 +++++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/cargo/core/dependency.rs b/src/cargo/core/dependency.rs index 08966e6e4..48f4bd456 100644 --- a/src/cargo/core/dependency.rs +++ b/src/cargo/core/dependency.rs @@ -249,6 +249,7 @@ impl Dependency { pub fn is_transitive(&self) -> bool { self.inner.is_transitive() } pub fn is_build(&self) -> bool { self.inner.is_build() } pub fn is_optional(&self) -> bool { self.inner.is_optional() } + /// Returns true if the default features of the dependency are requested. pub fn uses_default_features(&self) -> bool { self.inner.uses_default_features() @@ -263,6 +264,17 @@ impl Dependency { pub fn matches_id(&self, id: &PackageId) -> bool { self.inner.matches_id(id) } + + pub fn map_source(self, to_replace: &SourceId, replace_with: &SourceId) + -> Dependency { + if self.source_id() != to_replace { + self + } else { + Rc::try_unwrap(self.inner).unwrap_or_else(|r| (*r).clone()) + .set_source_id(replace_with.clone()) + .into_dependency() + } + } } impl Platform { diff --git a/src/cargo/core/manifest.rs b/src/cargo/core/manifest.rs index a4b401df0..02e9b4527 100644 --- a/src/cargo/core/manifest.rs +++ b/src/cargo/core/manifest.rs @@ -4,7 +4,8 @@ use std::path::{PathBuf, Path}; use semver::Version; use rustc_serialize::{Encoder, Encodable}; -use core::{Dependency, PackageId, PackageIdSpec, Summary, WorkspaceConfig}; +use core::{Dependency, PackageId, Summary, SourceId, PackageIdSpec}; +use core::WorkspaceConfig; use core::package_id::Metadata; pub enum EitherManifest { @@ -232,6 +233,14 @@ impl Manifest { pub fn set_summary(&mut self, summary: Summary) { self.summary = summary; } + + pub fn map_source(self, to_replace: &SourceId, replace_with: &SourceId) + -> Manifest { + Manifest { + summary: self.summary.map_source(to_replace, replace_with), + ..self + } + } } impl VirtualManifest { diff --git a/src/cargo/core/package.rs b/src/cargo/core/package.rs index 112d68b06..ffd5c9364 100644 --- a/src/cargo/core/package.rs +++ b/src/cargo/core/package.rs @@ -99,6 +99,14 @@ impl Package { .filter(|&(d, _)| d < 4); matches.min_by_key(|t| t.0).map(|t| t.1) } + + pub fn map_source(self, to_replace: &SourceId, replace_with: &SourceId) + -> Package { + Package { + manifest: self.manifest.map_source(to_replace, replace_with), + manifest_path: self.manifest_path, + } + } } impl fmt::Display for Package { diff --git a/src/cargo/core/package_id.rs b/src/cargo/core/package_id.rs index dfba5d7c6..8f682d48c 100644 --- a/src/cargo/core/package_id.rs +++ b/src/cargo/core/package_id.rs @@ -157,6 +157,16 @@ impl PackageId { }), } } + + pub fn with_source_id(&self, source: &SourceId) -> PackageId { + PackageId { + inner: Arc::new(PackageIdInner { + name: self.inner.name.to_string(), + version: self.inner.version.clone(), + source_id: source.clone(), + }), + } + } } impl Metadata { diff --git a/src/cargo/core/summary.rs b/src/cargo/core/summary.rs index 419cc05d5..81169c54d 100644 --- a/src/cargo/core/summary.rs +++ b/src/cargo/core/summary.rs @@ -81,6 +81,19 @@ impl Summary { self.dependencies = deps.into_iter().map(f).collect(); self } + + pub fn map_source(self, to_replace: &SourceId, replace_with: &SourceId) + -> Summary { + let me = if self.package_id().source_id() == to_replace { + let new_id = self.package_id().with_source_id(replace_with); + self.override_id(new_id) + } else { + self + }; + me.map_dependencies(|dep| { + dep.map_source(to_replace, replace_with) + }) + } } impl PartialEq for Summary { -- 2.30.2